
package model;

import components.Database;
import components.JSqlList;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;

/**
 * @author 12016977 GEORGIOS FLOURIS
 * 
 * This is the model for the LID table of the Klapstuk DB.
 * 
 */



public class PersonLid {
    // model fields and flags
    private int code;
    private String naam;
    private String straat;
    private String huisnummer;
    private String postcode;
    private String geslacht;
    public static final String MAN = "M";
    public static final String VROUW = "V";
    private String email;
    private boolean booleanResultEmail= false;
    private String telefoon;
    private boolean booleanResultTelefoon= false;
    private String plaats;
    private boolean booleanResultPlaats= false;
    // It has been decided in the group that tegoed is not going to be an attribute of leden. It will go to inlenen uitlenen.
    //private String tegoed;
    //private boolean booleanResultTegoed= false;
    private Date startLidmaatschap= null;
    private Date eindLidmaatschap= null;
    private DateFormat mysqlDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static DateFormat dateConverterFormat = new SimpleDateFormat("yyyy-MM-dd");
    
   

    
    // the basic contructor 
    public PersonLid() {
    }
    
    //contructor with attributes setting
    public PersonLid (String naam, String straat, String huisnummer, String postcode, String geslacht, String email, String telefoon, String plaats, Date startLidmaatschap, Date eindLidmaatschap) throws Exception{
        //setNaam(naam);
        //setStraat(straat);
        //setHuisnummer(huisnummer);
        //setPostcode(postcode);
        //setGeslacht(geslacht);
        //setEmail(email);
        //setTelefoon(telefoon);
        //setPlaats(plaats);
        //setTegoed(tegoed);
        //setStartLidmaatschap(startLidmaatschap);
        //setEindLidmaatschap(eindLidmaatschap);
    }

    //Following the getter-setter methods for the attributes
    public void setCode(int code){
        this.code=code;
    }
    
    public int getCode(){
        return code;
    }
    
    public void setNaam(String naam) throws Exception {
        
        //Before validating the name, check if user has actually entered something
        if (naam != null && !naam.isEmpty()){
        
            /* Name validation:
             * 
             * 'naam' should contain names.
             * Example value : Georgios Theodorus Michael Johannes Mirko
             * First names can have between 1 and 12 chars, so a combination of the above is possible like: Georgios TMJM
             */
            
            Pattern naamPattern = Pattern.compile("[a-zA-Z]{1,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}");
            Matcher naamMatcher = naamPattern.matcher(naam);
            boolean booleanResultNaam = naamMatcher.matches();
        
                if (booleanResultNaam) {
                    this.naam= naam;
                } else {
                   
                    throw new Exception("Naam waarde niet geldig (a-z)");
                }
        } else {
            
            throw new Exception("Naam is null of leeg");
        }
    }
    
    public String getNaam(){
        return naam;
    }
    
    //Setting string straat and validation
    public void setStraat(String straat)throws Exception {
        
        if (straat != null && !straat.isEmpty()){
        
            /* Straat validation:
             * 
             * 'Straat' must contain up to 4 words.
             * Example value : California straat disctrict
             * each word must be of a-z chars
             */
            
            Pattern straatPattern = Pattern.compile("[a-zA-Z]{1,15}\\s*[a-zA-Z]{0,15}\\s*[a-zA-Z]{0,15}\\s*[a-zA-Z]{0,15}");
            Matcher straatMatcher = straatPattern.matcher(straat);
            boolean booleanResultStraat = straatMatcher.matches();
        
                if (booleanResultStraat) {
                    
                    this.straat=straat;
                    
                } else {
                     
                    throw new Exception("Straat waarde niet geldig, bv (a-z)"); 
                }
        } else {
            
            throw new Exception("Straat is null of leeg");           
        }
    }
    
    public String getStraat(){
        return straat;
    }
    
    //setting huisnummer and validation of value
    public void setHuisnummer(String huisnummer) throws Exception {
        
        if (huisnummer != null && !huisnummer.isEmpty()){
        
            /* huisnummer validation:
             * http://nl.wikipedia.org/wiki/Huisnummer
             * 
             * 'Huisnummer' must contain up to 7 numbers and 1 letters en 3 numbers.
             * Example value : 10311A02 (huinummer:10311, begande grond:A, kamer:02)
             * DB VALUE MUST BE always standardized without spaces even if they are in the input
             * and letters in UPPER case regardless the input case.
             */
            
            Pattern huisnummerPattern = Pattern.compile("([0-9]{1,7})\\W*([a-zA-Z]{0,1})\\W*([0-9]{0,3})");
            Matcher huisnummerMatcher = huisnummerPattern.matcher(huisnummer);
            boolean booleanResultHuisnummer = huisnummerMatcher.matches();
        
                if (booleanResultHuisnummer) {
                    this.huisnummer=huisnummerMatcher.group(1) + huisnummerMatcher.group(2).toUpperCase() + huisnummerMatcher.group(3);
                   
                } else {
                
                    throw new Exception("Huisnummer waarde niet geldig, bv 999A99");
                }
        } else { 
            
            throw new Exception("Huisnummer is null of leeg");
        }
    }
    
    public String getHuisnummer(){
        return huisnummer;
    }
    
    //setting postcode and validation of value
    public void setPostcode(String postcode) throws Exception {
        if (postcode != null && !postcode.isEmpty()){
        
            /* postcode validation:
             * http://nl.wikipedia.org/wiki/Postcode
             * 
             * 'Postcode' must contain 4 numbers and 2 letters.
             * Example value : 2198AZ (De eerste 2 cijfers geven de regio aan, de laatste 2 cijfers de wijk. De twee letters geven de buurt en straat aan)
             * 
             * DB VALUE MUST BE always standardized without spaces even if they are in the input
             * and letters in UPPER case regardless the input case.
             */
            
            Pattern postcodePattern = Pattern.compile("([0-9]{4})\\W*([a-zA-Z]{2}).*");
            Matcher postcodeMatcher = postcodePattern.matcher(postcode);
            boolean booleanResultPostcode = postcodeMatcher.matches();
        
                if (booleanResultPostcode) {
                    this.postcode=postcodeMatcher.group(1) + postcodeMatcher.group(2).toUpperCase();
                    
                } else {
                    
                     throw new Exception("Postcode waarde niet geldig, bv 9999XX");
                }
        } else {
            
             throw new Exception("Postcode is null of leeg");
        }
    }
    
    public String getPostcode(){
        return postcode;
    }
    
    //setting gender from combo box values, no pattern used
    public void setGeslacht(String geslacht) throws Exception {
        if (geslacht.equals(MAN) ||geslacht.equals(VROUW)){
            this.geslacht=geslacht;
            
        } else {
            
             throw new Exception("Kies een waarde");
        }
    }
    
    public String getGeslacht(){
        return geslacht;
    }
    
    //setting email and validation of value
    public void setEmail(String email) throws Exception {
        if (email != null && !email.isEmpty()){
        
            /* email validation:
             *              
             * 'email' must contain the @ sign and must capture as many domains as possible.
             */
            
            Pattern emailPattern = Pattern.compile("([0-9a-zA-Z]([-\\.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})");
            Matcher emailMatcher = emailPattern.matcher(email);
            booleanResultEmail = emailMatcher.matches();
        
                if (booleanResultEmail) {
                    this.email=email;
                    
                } else {
                    
                     throw new Exception("E-mail waarde niet geldig");
                }
        } else {
            
            this.email="";
            booleanResultEmail = true;
        }
    }
    
    public String getEmail(){
        return email;
    }
    
    //setting telefoon and validation of value
    public void setTelefoon(String telefoon) throws Exception {
        if (telefoon != null && !telefoon.isEmpty()){
        
            /* telefoon validation:
             *              
             * 'telefoon' must contain only digits. if any chars are found there will be a message. Non word chars are not allowed in DB
             * http://www.telephorum.org/telewiki/Lijst_van_Nederlandse_netnummers
             * 
             * examples of invalid input that will be cleaned. 
             * 10 digits will match:
             * 023 5555555
             * 06 12345678
             * 0252 123456
             * 0235555555    <<<< will be seperated by space
             * 023-5555555 etc << dash will be removed
             * 0252 123456
             * 0252123456    <<<< 4 digit seperation 
             */
            
            
            //First try the 2 AND 3 DIGIT numbers
            Pattern telefoonPattern2or3Digits = Pattern.compile("(((?:01(0|3|4|5)))|((?:02(0|3|4|6)))|((?:03(0|3|5|6|8)))|((?:04(0|3|5|6)))|((?:05(0|3|5|8)))|((?:07(\\d)))|(06))\\s?\\-?(\\d{6,8})");
            
            
            Matcher telefoonMatcher = telefoonPattern2or3Digits.matcher(telefoon);
            booleanResultTelefoon = telefoonMatcher.matches();
        
                if (booleanResultTelefoon) {
                    this.telefoon=telefoonMatcher.group(1) + " " + telefoonMatcher.group(15);
                    
                } else {
                    
                   //THEN try 4 DIGIT numbers
                    Pattern telefoonPattern4Digits = Pattern.compile("(\\d{4})\\s?\\-?(\\d{6})");
                    Matcher telefoonMatcher1 = telefoonPattern4Digits.matcher(telefoon);
                    booleanResultTelefoon = telefoonMatcher1.matches();
                    
                        if(booleanResultTelefoon){
                            
                            this.telefoon=telefoonMatcher1.group(1) + " " + telefoonMatcher1.group(2);
                    
                        }else{
                            
                         throw new Exception("Telefoon waarde niet geldig");
                    
                    }
                }
        } else {
            this.telefoon="";
            booleanResultTelefoon = true;
        }
        
    }
    
    public String getTelefoon(){
        return telefoon;
    }
    
    //setting plaats and validation of value
    
    public void setPlaats(String plaats) throws Exception{
        if (plaats != null && !plaats.isEmpty()){
                    
            Pattern plaatsPattern = Pattern.compile("[a-zA-Z]{1,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}\\s*[a-zA-Z]{0,12}");
            Matcher plaatsMatcher = plaatsPattern.matcher(plaats);
            booleanResultPlaats = plaatsMatcher.matches();
        
                if (booleanResultPlaats) {
                    this.plaats=plaats;
                    
                } else {
                    
                     throw new Exception("Plaats waarde niet geldig");
                }
        } else {
            this.plaats="";
            booleanResultPlaats = true;
        }
        
    }
    
    public String getPlaats(){
        return plaats;
    }
    

    /* ATTENTION. THE GROUP DECIDED TEGOED WILL BE ATTRIBUTE OF INLENEN-UITLENEN SO IT HAS BEEN DISABLED FROM LID MODEL
    // setting and validating tegoed value
    public void setTegoed(String tegoed){
        
        //Before validating the tegoed, check if user has actually entered something
        if (!tegoed.isEmpty() && tegoed!= null) throws Excpetion{
        
            /* tegoed validation:
             * 
             * 'tegoed' could have or not have decimal digits in input.
             * Though we always make sure we store double in DB with up to 2 decimals.
             * 
             * Last avoid exception when non dot is entered as delimiter for the double value (eg 2,33), using comma
             *
           
            
            Pattern tegoedPattern = Pattern.compile("([0-9]{1,9})\\.*\\,*\\s*([0-9]{0,9}).*");
            Matcher tegoedMatcher = tegoedPattern.matcher(String.valueOf(tegoed));
            booleanResultTegoed = tegoedMatcher.matches();
            //System.out.println("group1 " + tegoedMatcher.group(1));
            //System.out.println("group2 " + tegoedMatcher.group(2));
              
                if (booleanResultTegoed) {
                    // set delimiter always to dot
                    String makeDouble = tegoedMatcher.group(1) + "." + tegoedMatcher.group(2);
                    
                    // parse double from String
                    double parsedDouble = Double.valueOf(makeDouble);
                    
                    // give double 2 desimals
                    double double2Decimals = (int)(parsedDouble*100)/100.0;
                    
                    // return string to the GUI
                    this.tegoed = String.valueOf(double2Decimals);
                } else {
                    
                     throw new Exception("Waarde niet goed");
                }
        } else {
            this.tegoed="";
            booleanResultTegoed = true;
        }
    }
    
    public String getTegoed(){
        return tegoed;
    }

    */    
    
    public static Date convertToDate(String dateTextValue) throws Exception {
        if (dateTextValue != null && !dateTextValue.isEmpty()){
            
            try {
                
                Date dateString2Date = dateConverterFormat.parse(dateTextValue);
                return dateString2Date;
                
            } catch (Exception ex) {
                    
                throw new Exception("Datum waarde niet geldig");
            }
            
        } else {
         
            throw new Exception("Datum niet geldig, moet in CCYY-MM-DD format"); 
        }  
    }
    
   public void setStartLidmaatschap(Date startLidmaatschap) throws Exception {
    
        
        Pattern startLidmaatschapPattern = Pattern.compile("((?:19|20)[0-9]{2})\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])");
        Matcher startLidmaatschapMatcher = startLidmaatschapPattern.matcher(mysqlDateFormat.format(startLidmaatschap));
            
                if (startLidmaatschapMatcher.matches() ){
                    
                    // if this is an existing member THE START DATE CAN BE IN THE PAST
                    if(Integer.toString(getCode()) == null ? Integer.toString((PersonLid.getNextCode())) != null : !Integer.toString(getCode()).equals(Integer.toString((PersonLid.getNextCode()))) && startLidmaatschap.before(getYesterday()) ){
                    
                        this.startLidmaatschap = startLidmaatschap;
                    
                    }else{
                        
                        if (!startLidmaatschap.before(getYesterday())){
                            this.startLidmaatschap = startLidmaatschap;
                            
                        }else{
                            throw new Exception("Datum kan niet in verleden zijn voor nieuw Lid");
                            
                        }
                    }
                } else { 
                    
                    throw new Exception("Datum moet in CCYY-MM-DD format zijn");
                }
    }
    
    //NO Standard date in correct format
    private String getStartLidmaatschapFormatted() {
        String startLidmaatschapFormatted = mysqlDateFormat.format(startLidmaatschap);
        return startLidmaatschapFormatted;
    }
  
    public Date getStartLidmaatschap() {
        return startLidmaatschap;
      
    }
    
      public void setEindLidmaatschap(Date eindLidmaatschap) throws Exception {
    
        Pattern eindLidmaatschapPattern = Pattern.compile("((?:19|20)[0-9]{2})\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])");
        Matcher eindLidmaatschapMatcher = eindLidmaatschapPattern.matcher(mysqlDateFormat.format(eindLidmaatschap));
                // Check if date is valid                    
                if (eindLidmaatschapMatcher.matches()){
                    // check that end date is not before start date.
                    if (startLidmaatschap.before(eindLidmaatschap)){
                        this.eindLidmaatschap = eindLidmaatschap;
                    
                    } else { 
                        throw new Exception("Datum moet na startdatum zijn. ");}

                } else { 
                    throw new Exception("Datum moet in CCYY-MM-DD format zijn");
                }
    }
    
    
    private String getEindLidmaatschapFormatted() {
        String eindLidmaatschapFormatted = mysqlDateFormat.format(eindLidmaatschap);
        return eindLidmaatschapFormatted;
    }
  
    public Date getEindLidmaatschap() {
        return eindLidmaatschap;
      
    }
    
    public String getCurrentDate(){
        
        Calendar currentDate = Calendar.getInstance();
        String theDateOfToday = mysqlDateFormat.format(currentDate.getTime());
        return theDateOfToday;
    
    }
    
    public String getCurrentDatePlusYear(){
        Calendar currentDate = Calendar.getInstance();
        currentDate.add(Calendar.YEAR, 1);
        currentDate.add(Calendar.DAY_OF_MONTH, -1);
        String currentDatePlusYear = mysqlDateFormat.format(currentDate.getTime());
        return currentDatePlusYear;
    
    }
    
    public Date getYesterday() throws Exception {
       
       Date todaysDate = new Date();
           
       if (todaysDate!=null){
            Date startingDate = new Date();
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTime(startingDate);
            gc.add(Calendar.DAY_OF_YEAR, -1);
            Date todaysDateMinusOne = gc.getTime(); 
            return todaysDateMinusOne;
            
       } else {
           
           throw new Exception ("Error getting todays Date");
       }
    }
  
    //Following the Access Layer code
    
    // insert or update of member. (update = key is already present else insert)
    public boolean save() {
        
        // if this code is new then insert
       
        if(Integer.toString(getCode()) == null ? Integer.toString((PersonLid.getNextCode())) != null : !Integer.toString(getCode()).equals(Integer.toString((PersonLid.getNextCode())))) {
            
            return update();
            
        } else { 
            
            return insert();
        }
    }
    
    // method to insert into the DB
    private boolean insert() {
    boolean successful = false;
    
    //Checking to see whether the member is present already in the DB.
    if (getDoubleMember(naam, postcode, straat, huisnummer) < 1){
    
    //checking if values are empty. Value validation of name inside the setNaam()
    if ((naam != null && !naam.isEmpty()) &&
        (straat != null && !straat.isEmpty()) &&
        (postcode != null && !postcode.isEmpty()) &&
        (huisnummer != null && !huisnummer.isEmpty()) &&
        (geslacht != null && (geslacht.equals(MAN) ||geslacht.equals(VROUW))) &&
         booleanResultEmail && // not compulsory values
         booleanResultTelefoon &&
         booleanResultPlaats &&
         //booleanResultTegoed &&
        (startLidmaatschap != null)&&
        (eindLidmaatschap != null)    
        ) {
        
        String query = "Insert into lid(naam, straat, huisnummer, postcode, geslacht, email, telefoon, plaats, startLidmaatschap, eindLidmaatschap) "
                + "values('" + naam + "', '" + straat + "', '" + huisnummer + "', '" + postcode +"', '" + geslacht +"', '" + email +"', '" + telefoon +"', '" + plaats +"', '" +  getStartLidmaatschapFormatted() +"', '" +  getEindLidmaatschapFormatted() +"')";
            if (Database.executeInsertQuery(query) > 0) {

                //Test that indeed the latest insert worked as expected and report to the user
                query = "select max(code) AS lidcode from lid where naam = '" + naam + "'";
                String codeString = Database.returnLidCode(query);
                
                    if (codeString == null) {
                        
                        successful = false;
                        
                    } else {
                        
                        // get the code to give it to the member 
                        JOptionPane.showMessageDialog(null, "Lid toevoegen is succesvol." + "\nDe code van het nieuwe lid is \"" + codeString + "\"");
                        successful = true;
                    }
            }
    }
    return successful;
    } else {
         JOptionPane.showMessageDialog(null, "Lid bestaat in de database.\n Ga naar ' Lid Zoeken '.", "error", JOptionPane.ERROR_MESSAGE);
         successful = false;
         return successful;
    }
  }
   
    // method for updating an existing member 
    private boolean update() {
       
        
    if ((naam != null && !naam.isEmpty()) &&
        (straat != null && !straat.isEmpty()) &&
        (postcode != null && !postcode.isEmpty()) &&
        (huisnummer != null && !huisnummer.isEmpty()) &&
        (geslacht != null && (geslacht.equals(MAN) ||geslacht.equals(VROUW))) &&
         booleanResultEmail && // not compulsory values
         booleanResultTelefoon &&
         booleanResultPlaats &&
        (startLidmaatschap != null)&&
        (eindLidmaatschap != null)   
        ) {
      String query = "update lid set " + "naam = '" + naam + "', " +
               "straat = '" + straat + "', " +
               "huisnummer = '" + huisnummer + "', " +
               "postcode = '" + postcode + "', " +
               "geslacht = '" + geslacht + "', " +
               "email = '" + email + "', " +
               "telefoon = '" + telefoon + "', " +
               "plaats = '" + plaats + "', " +
               //"tegoed = '" + tegoed + "', " +
               "startLidmaatschap = '" + getStartLidmaatschapFormatted() + "', " +
               "eindLidmaatschap = '" + getEindLidmaatschapFormatted() + "' " +
               "where code = " + code ;
      JOptionPane.showMessageDialog(null, "Lid update is succesvol.");
      return Database.executeUpdateQuery(query) == 1;
    } else {
        return false;
    }
  }
      
  // method to search the leden and return a PersonLid object to fill in the form
  public static PersonLid[] getLeden(String searchTerm) {
    
    // Read in the String and split it using the "space" as seperator
    String[] multipleSearchTerms = searchTerm.split(" ");  

 
    String query = "select code, naam, straat, huisnummer, postcode, geslacht, "
                    + "email, telefoon, plaats,"
                    + "startLidmaatschap, eindLidmaatschap  from lid "
                    + "where code is NOT null";
                   
                //now try all words in the search terms in the concerend fields
    
                        for (int i=0; i<multipleSearchTerms.length; i++ ){
                            String word = multipleSearchTerms[i];
                            
                            query += " and code = '" + word + "' or"
                                   + " postcode like '%" + word + "%' or "
                                   + " naam like '%" + word + "%' or "
                                   + " huisnummer like '%" + word + "%' or "
                                   + " straat like '%" + word + "%'";
                        }   
                    
                            query += " order by 1 asc";
    
    return getLedenList(query);
  }    
  
  // method to generate provisional code for the non editable jTextField
  public static int getNextCode() {
    String query = "select max(code) from lid";
    String codeString = Database.returnLidCode(query);
    return Integer.valueOf(codeString) + 1;
  }
  // Query to check if the new member exists in db.
  private static int getDoubleMember(String naam, String postcode, String straat, String huisnummer) {
    String query = "select code from lid "
            + "where naam = '" + naam + "' "
            + "and postcode = '" + postcode + "' "
            + "and straat = '" + straat + "' "
            + "and huisnummer = '" + huisnummer + "'";
    
    String existingCode = Database.returnLidCode(query);
    
        if (existingCode!=null){
            
            return Integer.valueOf(existingCode);
        
        } else {
         
            return 0;
        
        } 
  }
  
  
  
  private static PersonLid[] getLedenList(String query) {
    //get the data from DB
    ResultSet queryResult = Database.executeSelectQuery(query);
    //put the data in an array
    ArrayList<PersonLid> leden = new ArrayList<PersonLid>();
    // array to PersonLid object
    try {
      while (queryResult.next()) {
        PersonLid value = new PersonLid();
        try {
        value.code = queryResult.getInt("code");
        value.setNaam(queryResult.getString("naam"));
        value.setStraat(queryResult.getString("straat"));
        value.setHuisnummer(queryResult.getString("huisnummer"));
        value.setPostcode(queryResult.getString("postcode"));
        value.setGeslacht(queryResult.getString("geslacht"));
        value.setEmail(queryResult.getString("email"));
        value.setTelefoon(queryResult.getString("telefoon"));
        value.setPlaats(queryResult.getString("plaats"));
        //value.setTegoed(queryResult.getString("tegoed"));
            
                value.setStartLidmaatschap(queryResult.getDate("startLidmaatschap"));
                value.setEindLidmaatschap(queryResult.getDate("eindLidmaatschap"));
            } catch (Exception ex) {
                Logger.getLogger(PersonLid.class.getName()).log(Level.SEVERE, null, ex);
            }
        
        //array
        leden.add(value);
      }
    } catch (SQLException e) {
        
    }
    if(leden.isEmpty()) {
        
        JOptionPane.showMessageDialog(null, "geen lid gevonden met deze zoek term");
        
    }
      
    //put the results in an array
    PersonLid[] myArray = new PersonLid[leden.size()];
    for(int i= 0; i< leden.size(); i++) {
          
          myArray[i] = leden.get(i);

    }
    //Return this array to the search screen
    return myArray;
  }
  
  // allign text for the searching functionality.
   @Override
   public String toString() {
    String output = "";
    output += JSqlList.padStringRight(String.valueOf(getCode()), 5);
    output += JSqlList.padStringRight(getNaam().toUpperCase(), 40);
    output += JSqlList.padStringRight(getPostcode(), 10);
    output += JSqlList.padStringRight(getHuisnummer(), 13);
    output += JSqlList.padStringRight(getStraat(), 10);
    
    return output;
  }
  
 
  // Remove a member
  //TO DO check if member has paid or has still something to deliver...
  public boolean delete() {
      
    String query = "delete from lid where code =" + code; 
    return Database.executeDeleteQuery(query) == 1;
    
  }

   
  
}